Sep=package.config:sub(1, 1)
user=rime_api:get_user_data_dir()
data=rime_api:get_shared_data_dir()
program=data:sub(1,-6)
exist=function(name)
 local C=function(path)
  local file=io.open(path,"r")
  return file and file:close() and path
 end
 return C(user..Sep..name) or C(data..Sep..name)
end
local map
do
 local file=io.open(exist("custom_command.txt"),"r")--打开文件
 if not file then return end
 map=load(file:read("*all"))()
 file:close()
end
for k,v in pairs(map) do
 for i=1,#v do
  if v[i][3] then
   map[k][i][1]='"'..map[k][i][1]..'"'
  end
 end
end
local sendcommand=false
local command
local bat_dir=user..Sep.."build"..Sep.."run.bat"--通过 bat 文件代执行命令以兼容 utf8
local cpl_map={}
local symbol="/"
local symbol_l=#symbol
local hint="快速启动"
local name="quickstart_"
local K={
["Enter"]={["Return"]=true,["KP_Enter"]=true},
["Tab"]={["Tab"]=true},
["BackSpace"]={["BackSpace"]=true},
}
local Valid={}
for _,v in pairs(K)do
 for k,_ in pairs(v)do
  Valid[k]=true
 end
end
return {
 function(key,env)
  if sendcommand then
   sendcommand=false
   os.execute(command)--os.execute 会导致lua暂停,因此用 sendcommand 变量指示在键 Release 时执行
   return 0
  end
  local key_event=key:repr()
  if env.engine.context.input=="" then cpl_map={} return 2 end
  if not Valid[key_event] then return 2 end--键不合法则直接Return
  local input=env.engine.context.input:lower()
  if map[input] and K.Enter[key_event] then--命令正确的情况下按回车则执行命令
   local index=tonumber(env.engine.context:get_selected_candidate().type:match(name.."([0-9]+)"))
   if not index then return 2 end
   sendcommand=true
   if map[input][index][3] then
    command='"'..bat_dir..'"'
    local str='chcp 65001\nif exist S (start "" S&&exit)'
    str=str:gsub('S',map[input][index][1])
    io.open(bat_dir,"w+"):write(str):close()
   else
    command=map[input][index][1]
   end
   env.engine.context:clear()
   return 1
  end
  if input:find("^"..symbol) then--命令未完整进入补全状态
   if #cpl_map==0 then--命令未完整且 cpl_map 长度为零则重新获取 cpl_map 补全列表
    for k,v in pairs(map) do
     if k:find("^"..input..".") then
      cpl_map[#cpl_map+1]=k:sub(1+symbol_l)
     end
    end
    table.sort(cpl_map,function(a,b) return #a>#b end)
    table.insert(cpl_map,1,input:sub(1+symbol_l))
   end
   if K.Tab[key_event] then--补全状态按 Tab 可以在 cpl_map 列表中循环
    env.engine.context:pop_input(#input-symbol_l)
    env.engine.context:push_input(cpl_map[#cpl_map])
    table.remove(cpl_map,#cpl_map)
    return 1
   end
   if K.BackSpace[key_event] and input:sub(1+symbol_l)~=cpl_map[1] then--补全状态按 BackSpace 会退出补全状态并归还编码
    env.engine.context:pop_input(#input-symbol_l)
    env.engine.context:push_input(cpl_map[1])
    cpl_map={}
    return 1
   end
   cpl_map={}
  end
  return 2
 end
 ,
 function(_,seg,env)
  local input=env.engine.context.input:lower()
  if map[input] then
   for i=1,#map[input] do
    local cand=Candidate(name..i,seg.start,seg._end,map[input][i][2],"快速启动")
    cand.quality=8102
    yield(cand)
   end
  end
 end
}